package com.e2oto.seller.common.utils;

import android.content.Context;

import com.e2oto.seller.common.Config;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import top.zibin.luban.Luban;
import top.zibin.luban.OnCompressListener;

/**
 * Created by ZhangLiQiang on 2017/9/20.
 */

public class ImageCompressUtils {

    /***
     *  300K一下 分辨率不变
     * 如果设置ignoreBy 那么不压缩图片的话就会返回图片原来的路径 否则返回自己设置的路径
     * @param images
     * @param context
     * @param compressListener
     */
    public static void compress(List<String> images, final Context context, OnCompressListener compressListener) {

        Luban.with(context)
                .load(images)// 传人要压缩的图片列表
                .ignoreBy(100) // 忽略不压缩图片的大小
                .setTargetDir(Config.getImageCacheDir())// 设置压缩后文件存储位置
                .setCompressListener(compressListener)
                .launch();    //启动压缩
    }

    /***
     * 同步 压缩一个list
     * @param list
     * @param context
     * @throws Exception
     */
    public static List<File> getCompressedImageList(List<String> list, Context context) throws Exception {

        return Luban.with(context)
                .load(list)// 传人要压缩的图片列表
                .ignoreBy(100) // 忽略不压缩图片的大小
                .setCompressListener(new OnCompressListener() {
                    @Override
                    public void onStart() {

                    }

                    @Override
                    public void onSuccess(File file) {
                        LogTools.e("压缩图片成功:" + file.getAbsolutePath());
                    }

                    @Override
                    public void onError(Throwable e) {
                        LogTools.e("压缩图片失败:" + e.toString());
                    }
                })
                .setTargetDir(Config.getImageCacheDir())// 设置压缩后文件存储位置
                .get();    //启动压缩
    }

    /***
     * 同步 压缩一张
     * @param path
     * @param context
     * @throws Exception
     */
    public static String getCompressedImage(String path, Context context) throws Exception {
        return Luban.with(context)
                .load(path)// 传人要压缩的图片列表
                .ignoreBy(100) // 忽略不压缩图片的大小
                .setCompressListener(new OnCompressListener() {
                    @Override
                    public void onStart() {

                    }

                    @Override
                    public void onSuccess(File file) {
                        LogTools.e("压缩单张图片成功:" + file.getAbsolutePath());
                    }

                    @Override
                    public void onError(Throwable e) {
                        LogTools.e("压缩单张图片失败:" + e.toString());
                    }
                })
                .setTargetDir(Config.getImageCacheDir())// 设置压缩后文件存储位置
                .get()
                .get(0)
                .getAbsolutePath();
    }

    /***
     * 直接用get是同步  用rxjava实现异步
     * @param consumer
     * @param images
     * @param context
     */
    public static void compressByRx(Consumer<List<File>> consumer, List<String> images, final Context context) {
        Flowable.just(images)
                .observeOn(Schedulers.io())
                .map(new Function<List<String>, List<File>>() {
                    @Override
                    public List<File> apply(@NonNull List<String> list) throws Exception {
                        // 同步方法直接返回压缩后的文件
                        return Luban.with(context)
                                .ignoreBy(100) // 忽略不压缩图片的大小
                                .setTargetDir(Config.getImageCacheDir())// 设置压缩后文件存储位置
                                .load(list)
                                .get();
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(consumer);
    }
}
